/*
 * Copyright (C) 2024 ~ 2025 Deepin Technology Co., Ltd.
 *
 * Author:     zhangbingyi <zhangbingyi@uniontech.com>
 *
 * Maintainer: zhangbingyi <zhangbingyi@uniontech.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

//#include "window/namespace.h"
//#include "dtkwidget_global.h"
#include "common.h"
//#include "window/modules/common/gsettingkey.h"
#include "comdata.h"
//#include "window/modules/antivirus/antiviruswork.h"
#include "sysupdatermodel.h"

#include <QDateTime>
#include <QObject>
#include <QStringList>

class QGSettings;
class DBusInvokerInterface;
class SettingsInvokerInterface;
class AntiVirusWork;
class SysUpdaterModel;

class HomePageModel : public QObject
{
    Q_OBJECT
public:
    explicit HomePageModel(QObject *parent = nullptr);

public:
    // 设置上次体检分数
    void setSafetyScore(const int &score);
    // 获取上次体检分数
    int GetSafetyScore();
    // 设置上次体检时间
    void SetLastCheckTime(QDateTime dateTime);
    // 获取上次体检时间
    QDateTime GetLastCheckTime();
    // 获取当前病毒查杀服务扫描状态
    ScanStatus scanStatus();
    // 是否正在检测病毒库更新
    bool vdbUpdataChecking();

    // 是否正在操作隔离或信任区文件
    bool isOperatingIsolateTrustFiles();
    // 设置病毒查杀数据处理对象
    void SetAntiVirusWork(AntiVirusWork *work);
    // 设置是否处于快速病毒扫描中
    inline void SetVirusScanning(bool scanning) { m_virusScanning = scanning; }
    // 设置是否处于病毒库检测中
    inline void SetVdbChecking(bool checking) { m_vdbChecking = checking; }
    inline bool vdbUpdating() const { return /*m_antiVirusWork->vdbUpdating()*/ true; }
    // 设置是否处于自启动app数检测中
    inline void SetAutoStartAppChecking(bool checking) { m_autoStartAppChecking = checking; }
    // 是否处于自启动app数检测中
    inline bool autoStartAppChecking() { return m_autoStartAppChecking; }
    // 打开自启动管理页
    Q_SLOT void openStartupControlPage();
public:
    // 检查自启动
    void checkAutoStart();
    // 是否忽略检测自启动项
    bool ignoreAutoStartChecking() const;

    // 设置是否忽略检测自启动项
    void setIgnoreAutoStartChecking(bool ignore);

    //// ssh检测
    // 异步获取ssh状态
    void asyncGetSSHStatus() const;

    // 异步设置ssh状态
    void asyncSetSSHStatus(bool status);

    //// 系统更新检测
    // 设置是否处于系统版本检测中
    inline void SetSysVersionChecking(bool checking)
    {
        m_sysVersionChecking = checking;
    }
    // 是否处于系统版本检测中
    inline bool sysVersionChecking() const { return m_sysVersionChecking; }
    // 打开系统更新界面
    Q_SLOT void openSysUpdatePage();
public:
    // 设置是否处于垃圾文件检测中
    inline void SetTrashChecking(bool checking) { m_trashChecking = checking; }
    // 磁盘管理器 是否已安装
    bool isDiskManagerInterValid();
    // 获取磁盘状态
    bool getDiskStatus();
    // 设置是否处于磁盘检测中
    inline void SetDiskChecking(bool checking) { m_diskChecking = checking; }
    // 设置是否处于正在检测开发者模式
    inline void SetDevelopModeChecking(bool checking) { m_developModeChecking = checking; }
    // 是否处于开发者模式
    bool IsDeveloperMode();
    // 是否忽略检测开发者模式
    bool ignoreDevModeChecking() const;
    // 设置是否忽略检测开发者模式
    void setIgnoreDevModeChecking(bool ignore);

    // 获取当前系统语言
    QString getLocalLang();

public Q_SLOTS:
    // 进行首页快速病毒扫描
    void doHomepageVirusScan();
    // 当扫描结束发出扫描结果时
    void RecResultWhileScanFinished(QStringList list);
    // 当接收到修复问题文件结果时
    void RecRepairProblemFileResult(QString sPath);
    // 修复首页体检快速病毒扫描的结果
    void FixHomepageVirusScanResult();
    // 停止快速病毒扫描
    void stopVirusQuickScan();

    // 更新自启动应用个数
    void updateStartUpAppCount(bool bAdd, const QString &sID);

    // 垃圾文件扫描完成时
    void onTrashScanFinished(double sum);

    // 添加安全日志
    void addSecurityLog(QString sInfo);

    void onRequestStartTrashScan();
    void onRequestCleanSelectTrash();
    void sendNotifyUpdateVdb() {emit NotifyUpdateVdb();}
    void sendNotifyShowHomepage() {emit notifyShowHomepage();}
    void sendNotifyStopCheckSysUpdate() {emit notifyStopCheckSysUpdate();}
    void sendNotifyCheckSysUpdate() {emit NotifyCheckSysUpdate();}
    void sendCheckSysUpdateFinished(bool canUpdate) {emit CheckSysUpdateFinished(canUpdate);}
Q_SIGNALS:
    // 通知打开体检首页
    void notifyShowHomepage();
    // 首页病毒扫描结束信号
    void homepageVirusScanFinished(QStringList list);
    // 首页体检快速病毒扫描的结果修复完成
    void HomepageVirusScanResultFixed();
    // 通知去检查病毒库版本
    void NotifyCheckVdbVersion();
    // 检查病毒库版本完成
    void CheckVdbFinished(bool canUpdate);
    // 通知去更新病毒库
    void NotifyUpdateVdb();
    // 更新病毒库完成
    void UpdateVdbFinished(bool success);

    // 当自启动检查结束时
    void checkAutoStartFinished(int count);
    // 自启动应用数量改变时
    void autoStartAppCountChanged(int count);

    // 发送ssh状态
    void sendSSHStatus(bool status);

    // 通知去检查系统更新
    void NotifyCheckSysUpdate();
    // 通知去停止检查系统更新
    void notifyStopCheckSysUpdate();
    // 检查系统更新完成
    void CheckSysUpdateFinished(bool canUpdate);

    // 请求开始垃圾文件扫描
    void requestStartTrashScan();
    // 垃圾文件扫描完成时
    void trashScanFinished(const double sum);
    // 请求清理选中的垃圾文件
    void requestCleanSelectTrash();
    // 清理选中的垃圾文件完成时
    void cleanSelectTrashFinished();
public slots:
    void sendNotifyCheckVdbVersion() {emit NotifyCheckVdbVersion();}
    void sendRequestStartTrashScan() {emit requestStartTrashScan();}
    void sendRequestCleanSelectTrash() {emit requestCleanSelectTrash();}
private:
    // 获取允许自启动应用个数
    int getAutoStartAppCount() const;

private:
    // gsetting对象
    SettingsInvokerInterface *m_gSettingsInvokerInter;
    // 安全中心数据接口服务对象
    DBusInvokerInterface *m_defenderDataInvokerInter;
    // 控制中心dbus服务
    DBusInvokerInterface *m_controlCenterInvokerInter;
    // 安全中心界面dbus服务
    DBusInvokerInterface *m_defenderWindowInvokerInter;
    // 同步助手dbus服务，用于查询是否处于开发者模式
    DBusInvokerInterface *m_helperInvokerInter;
    // 磁盘管理dbus服务
    DBusInvokerInterface *m_diskManagerInvokerInter;
    // 流量监控系统dbus服务
    DBusInvokerInterface *m_netFlowMonitorInvokerInter;
    // 系统语言dbus服务
    DBusInvokerInterface *m_langSelectInvokerInter;

    // 病毒查杀数据交互对象
    AntiVirusWork *m_antiVirusWork;
    // 系统更新数据处理对象
    SysUpdaterModel *m_sysUpdaterModel;
    // 是否正在进行首页快速扫描
    bool m_virusScanning;
    // 病毒文件路径列表
    QStringList m_virusPathList;
    // 是否正在进行检查病毒库
    bool m_vdbChecking;
    // 是否正在进行检查自启动应用数
    bool m_autoStartAppChecking;
    // 是否正在进行检查系统版本
    bool m_sysVersionChecking;
    // 是否正在进行检测垃圾文件
    bool m_trashChecking;
    // 是否正在进行磁盘检测
    bool m_diskChecking;
    // 是否正在进行检查开发者模式
    bool m_developModeChecking;
};
